<?php
/**
 * モデル基底クラス
 *
 * @package Apm
 * @subpackage Model
 * @author hiasa-ryousuke@systemsoft.co.jp
 * @since 2010/10/20
 */
class Apm_Model_Base{

    /**
     * データベースのコネクションがパラメータで渡ってきたかのフラグ
     *
     * @var boolean
    */
    private $_param_db_connect = true;

    /**
     * データベースへSELECT文を送り、結果を返す<br>
     * 結果が1件の場合のみ、このメソッドを使用
     *
     * @param string $sql SQL文
     * @param array $db_params バインド変数
     * @return データベースの出力結果
     */
    public function dbGetData($sql, $db_params = "", $db = "")
    {
        //__log_debug(__FILE__, __LINE__, __METHOD__, '---------->>>');
        if(empty($db)){
            $db = $this->getDbConnection();
            $this->_param_db_connect = false;
        }
        if(empty($db_params)){
            $result = $db->query($sql);
        }
        else{
            $result = $db->query($sql, $db_params);
        }
        $data = $result->fetch();

        $profiler = $db->getProfiler();
        $profile_detail = array();
        $this->getDbProfileDetail($profiler, $profile_detail);
        __log_debug(__FILE__, __LINE__, __METHOD__, 'クエリ実行所要時間 = '.$profile_detail['elapsed_secs'].' / '.'フィールド取得件数 = '.count($data));
        __log_debug(__FILE__, __LINE__, __METHOD__, 'バインドパラメータ = '.$profile_detail['query_param']);
        __log_debug_ex('dbGetData --- クエリ実行所要時間 = '.round((float)$profile_detail['elapsed_secs'], 5).' 秒 / '.'フィールド取得件数 = '.count($data));
        //__log_debug(__FILE__, __LINE__, __METHOD__, '----------<<<');

        if($this->_param_db_connect == false){
            $db->closeConnection();
        }
        return $data;
    }

    /**
     * データベースへSELECT文を送り、結果を返す<br>
     * 結果が複数件ある場合、このメソッドを使用
     *
     * @param string $sql SQL文
     * @param array $db_params バインド変数
     * @return データベースの出力結果
     */
    public function dbGetList($sql, $db_params = "", $db = "")
    {
        if(empty($db)){
            $db = $this->getDbConnection();
            $this->_param_db_connect = false;
        }

        if(empty($db_params)){
	       $result = $db->query($sql);
	    }
	    else{
	       $result = $db->query($sql, $db_params);
	    }
	 
        $data = $result->fetchAll();
        
        $profiler = $db->getProfiler();
        $profile_detail = array();
        $this->getDbProfileDetail($profiler, $profile_detail);
        __log_debug(__FILE__, __LINE__, __METHOD__, 'クエリ実行所要時間 = '.$profile_detail['elapsed_secs'].' / '.'データ取得件数 = '.count($data));
        __log_debug(__FILE__, __LINE__, __METHOD__, 'バインドパラメータ = '.$profile_detail['query_param']);
        __log_debug_ex('dbGetList --- クエリ実行所要時間 = '.round((float)$profile_detail['elapsed_secs'], 5).' 秒 / '.'フィールド取得件数 = '.count($data));
        //__log_debug(__FILE__, __LINE__, __METHOD__, '----------<<<');

        if($this->_param_db_connect == false){
            $db->closeConnection();
        }
        return $data;
    }

    /**
     * データベースに対してINSERT,UPDATE,DELETEを実行する<br>
     *
     * @param string $sql SQL文
     * @param array $db_params バインド変数
     * @return void
     */
    protected function dbExecQuery($sql, $db_params = "", $db = "")
    {
        //__log_debug(__FILE__, __LINE__, __METHOD__, '---------->>>');
        if(empty($db_params)){
            $db->query($sql);
        }
        else{
            $db->query($sql, $db_params);
        }

        $profiler = $db->getProfiler();
        $profile_detail = array();
        $this->getDbProfileDetail($profiler, $profile_detail);
        __log_debug(__FILE__, __LINE__, __METHOD__, 'クエリ実行所要時間 = '.$profile_detail['elapsed_secs']);
        __log_debug(__FILE__, __LINE__, __METHOD__, 'バインドパラメータ = '.$profile_detail['query_param']);
        __log_debug_ex('dbExecQuery --- クエリ実行所要時間 = '.round((float)$profile_detail['elapsed_secs'], 5).' 秒');
        //__log_debug(__FILE__, __LINE__, __METHOD__, '----------<<<');
        return;
    }

    /**
     * データベースアクセス時のプロファイラを取得する<br>
     *
     * @param string $profiler プロファイラのインスタンス
     * @param array &$profile_detail プロファイラ情報の参照渡し
     * @return void
     */
    private function getDbProfileDetail($profiler, &$profile_detail)
    {
        $last_query = $profiler->getLastQueryProfile();
        $profile_detail['query'] = $last_query->getQuery();
        $profile_detail['elapsed_secs'] = $last_query->getElapsedSecs();
        $tmp = $last_query->getQueryParams();
        if(!empty($tmp)){
            foreach($tmp as $key => $value){
                $profile_detail['query_param'] .= sprintf('[%s] => \'%s\', ', $key, $value);
            }
            $profile_detail['query_param'] = rtrim($profile_detail['query_param'], ', ');
        }
    }

    /**
     * トランザクションの開始
     *
     * @return void
     */
    public function startTransaction($db)
    {
        //$db = $this->getDbConnection();
        $db->beginTransaction();
        return;
    }

    /**
     * トランザクションのコミット
     *
     * @return void
     */
    public function commitTransaction($db)
    {
        $db->commit();
        return;
    }

    /**
     * トランザクションのロールバック
     *
     * @return void
     */
    public function rollbackTransaction($db)
    {
        $db->rollBack();
        return;
    }

    /**
     * データベースへの接続を確立
     *
     * @return DBアダプター
     */
    public function getDbConnection()
    {
        //__log_debug(__FILE__, __LINE__, __METHOD__, '---------->>>');
        $configObject = Zend_Registry::get('config');
        $dbConfig = $configObject->database->toArray();
        $db_info = array();
        $db_info = array(
            'dbname'   => $dbConfig['dbname'],
            'username' => $dbConfig['username'],
            'password' => $dbConfig['password'],
            'charset'  => $dbConfig['charset'],
            'profiler' => $dbConfig['profiler'],
            'persistent' => $dbConfig['persistent']
        );
        $db = new Zend_Db_Adapter_Oracle($db_info);
        //__log_debug(__FILE__, __LINE__, __METHOD__, '----------<<<');
        return $db;
    }

}
?>
